import scrapy
from pprint import pprint
from copy import deepcopy
import time
from crawlspiderdemo.items import BookItem


class BooksSpider(scrapy.Spider):
    name = 'books'
    allowed_domains = ['bookschina.com']
    start_urls = ['http://www.bookschina.com/books/kinder/']
    base_url = "http://www.bookschina.com"

    def parse(self, response):
        # 1.获取到所有大分类的列表
        h2_list = response.xpath('//div[@class="categoriesList"]/div[@class="w1200 clearfix"]/h2')
        # pprint(h2_list)
        # 遍历大分类的列表,获取每一个大分类
        for h2 in h2_list:
            item = {}
            # item = BookItem()
            # 获取大分类的名字,选择器定位元素,并通过extract()或extract_first()来获取结果
            # extract()：返回一个包含有字符串的列表
            # {'b_cate': ['文创']}
            # extract_first()：返回列表中的第一个字符串,列表为空没有返回None
            # {'b_cate': '文创'}
            item['b_cate'] = h2.xpath("./a/text()").extract_first()
            # print(item)

            # 2.获取到当前大分类对应的所有小分类的列表
            # 下面的全部弟节点: following-sibling::*
            # 小分类就是当前大分类的下一个兄弟节点：following-sibling::*[1]
            li_list = h2.xpath("./following-sibling::ul[1]/li")
            # 遍历所有小分类的列表,获取每一个小分类
            for li in li_list:
                # 小分类的名字
                item['s_cate'] = li.xpath("./a/text()").extract_first()
                # 小分类的url地址
                # item["s_href"] = self.base_url + li.xpath("./a/@href").extract_first()
                item["s_href"] = li.xpath("./a/@href").extract_first()

                # 发送小分类的url地址请求,进入到列表页
                yield response.follow(
                    url=item['s_href'],
                    callback=self.parse_book,
                    meta={'item': deepcopy(item)}
                )

    def parse_book(self, response):
        # 3.获取图书分类列表页传入的item数据
        item = response.meta['item']
        # 获取到所有图书的列表页
        book_list = response.xpath("//div[@class='bookList']/ul/li")
        # 遍历图书的列表,获取每一本图书的信息
        for book in book_list:
            # 图书的名字
            item['book_name'] = book.xpath('.//h2/a/text()').extract_first()
            # 图片的url地址
            item['book_img_url'] = book.xpath('.//img[@class="lazyImg"]/@data-original').extract_first()
            # 作者
            item["book_author"] = book.xpath(".//a[@class='author']/text()").extract_first()
            # 出版日期
            item["book_pub_date"] = book.xpath(".//span[@class='pulishTiem']/text()").extract_first()
            # 出版社
            item["book_publisher"] = book.xpath(".//a[@class='publisher']/text()").extract_first()
            # 价格
            item["book_price"] = book.xpath(".//span[@class='sellPrice']/text()").extract_first()
            # 折扣
            item["book_discount"] = book.xpath(".//span[@class='discount']/text()").extract_first()
            # 定价
            item["book_pricing"] = book.xpath(".//del/text()").extract_first()
            # 描述信息
            item["book_desc"] = book.xpath(".//p[@class='recoLagu']/text()").extract_first()

            yield item

        # 翻页
        next_url = response.xpath('//li[@class="next"]/a/@href').extract_first()
        if next_url is not None:
            time.sleep(3)
            # Resquest需要提供完整的url才可以进行请求
            # response.follow会自动使用补充其中的url
            yield response.follow(
                next_url,
                callback=self.parse_book,
                meta={"item": deepcopy(item)}
            )

